import tensorflow as tf
import numpy as np

## 向量基础运算
#向量reduce：reduce减少一个维度
a = tf.range(1,10)  #1维数据, shape=[9,] 1维度
tf.print(a)
tf.print(tf.reduce_sum(a)) #不指定axis,就全部(维度)数据相加　shape=[] 0维度
# tf.print(tf.reduce_sum(a).shape) #全部(维度)数据相加　
tf.print(tf.reduce_mean(a)) #全部(维度)数据平均值
tf.print(tf.reduce_max(a)) #全部(维度)数据最大值
tf.print(tf.reduce_min(a)) #全部(维度)数据最小值
tf.print(tf.reduce_prod(a)) ##全部(维度)数据依次相乘

#张量指定维度进行reduce
tf.print('---reduce处理---')
b = tf.reshape(a,(3,3))
tf.print(b)
tf.print(tf.reduce_sum(b, axis=1)) # axis=1方向上求和，reduce之后维度减少一个
tf.print(tf.reduce_sum(b, axis=1, keepdims=True)) # 若保持原有的维度(2D),keepdim=True
tf.print(tf.reduce_sum(b, axis=0, keepdims=True))

#bool类型的reduce
tf.print('bool类型的reduce')
p = tf.constant([True,False,False])
# p = tf.constant([True,True,True])
q = tf.constant([False,False,True])
tf.print(tf.reduce_all(p)) # 对向量里面执行逻辑与: 如果所有的数值都是True，返回结果True=1，否则，返回False=0
tf.print(tf.reduce_any(q)) # 执行逻辑或: 只要一个True，它的返回结果True=1

#利用tf.foldr实现tf.reduce_sum
s = tf.foldr(lambda a,b:a+b, tf.range(10))  #累加求和=45
tf.print(s)

#arg最大/最小值索引
a = tf.range(1,10)
tf.print(tf.argmax(a))
tf.print(tf.argmin(a))

#tf.math.top_k可以用于对张量排序
# top_k 会用在分类领域中进行处理，找出最优可能的前k个类别数据
# 如果一个向量中全部都是概率，概率越大，数值越大
# 图像，自然语言，数据挖掘
tf.print('top_k')
a = tf.constant([1,3,7,5,4,8])
values,indices = tf.math.top_k(a,3,sorted=True) #a中取k=3个最大的数, sorted=True 将k个数据排序(由大到小)
tf.print(values)# 由大到小最大的k（3）个数值
tf.print(indices) # 对应values(数值)的下标
tf.print('top_k')
# 矩阵运算
#矩阵乘法
tf.print('矩阵乘法')
a = tf.constant([[1,2],[3,4]])
b = tf.constant([[2,0],[0,2]])
tf.print('使用@处理\n', a@b)
tf.print('使用matmul处理\n', tf.matmul(a, b))

#矩阵转置
a = tf.constant([[1,2],[3,4]])
tf.print(tf.transpose(a))

# 矩阵广播
a = tf.constant([1,2,3])
b = tf.constant([[0,0,0],[1,1,1],[2,2,2]])
tf.print(b + a)  #等价于 b + tf.broadcast_to(a,b.shape)